package com.client;

import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JToolBar;

import com.metier.logique.MSG;
import javax.swing.ImageIcon;
import javax.swing.JSeparator;
import java.awt.Component;
import javax.swing.Box;
import javax.swing.JComboBox;
import javax.swing.UIManager;
import com.metier.logique.JGoogleMapEditorPan;
import com.metier.persistance.*;

import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JList;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;

import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.ListSelectionModel;
import java.awt.Cursor;
import javax.swing.JLayeredPane;
import javax.swing.JCheckBox;



/**
 * @name FenetrePrincipale
 * @description Fenêtre principale du programme, lancée via le threadApplication.
 * 				Gère tous les évènements sur cette fenêtre.
 * 				Construit l'ensemble de son contenu et instancie les objets nécessitants la récupération des données de la BDD.
 * @method FenetrePrincipale - Constructeur principal.
 * @method defineListeners - Définit les écouteurs de la classe pour les évènements de souris, clavier et de fenêtre.
 * @method defineWindowAttributes - Défini les attributs principaux de la fenêtre. (Nom, taille, etc.)
 * @method buildMainMenu - Construit le menu principal de la fenêtre.
 * @method buildContentWindow - Construit le menu principal de la fenêtre.
 * 
 * ***************** Ambroise *****************
 * @method executerRechercheRapide - Exécute la recherche rapide.
 * @method supprimerLieuCourant - Supprime le lieu en cours d'utilisation.
 * @method loadParcours - Charge un parcours en fonction des paramètres du MSG.
 * @method selectTypeLoadForRecherch - Effectue les vérifications afin de sélectionner la bonne méthode en fonction des paramètres de la recherche rapide.
 * 
 * ***************** Julien *****************
 * @method afficherLieu - Displays the actually selected map.
 * @method remplirCbbLieu - Used to fill cbbLieu with all the maps in the DB.
 * @method modifierPoiPosition - Updates the location of a POI in the DB.
 * @method supprimerPoi - Deletes the currently selected POI
 * @method ajouterPoi - Add a POI where the user clicked.
 * @method afficherPois - Process displaying all the POIs according to the selected map in the cbbLieu.
 * @method afficherUnPoi - Displays a POI by generating a Label a the right coordinates in the oJPanelGoogleMap.
 * 
 * ***************** Adel *****************
 * @method btnCliquer - Enregistre les POI cliqués dans l'historique. Fonction utilisé pour les boutons précèdent et suivant.
 * @method loadHistoriqueElement - Cette méthode charge les éléments de l'onglet Historique du menu.
 * @method addPoiHistorique - Ajoute un poi à l'historique en session.
 * @method loadPoi - Affiche un élément sélectionné dans la liste_resultat. (Poi/Historique/Parcours/Lieu)
 * @method loadMap - Affiche la carte en fonction de l'id passé en paramètre.
 *
 * @author Ambroise
 * @since 07/03/2012
 * @lastEdit 17/03/2012
 */
public class FenetrePrincipale extends JFrame implements ActionListener, MouseListener, WindowListener, KeyListener, ListSelectionListener, ItemListener{

	private static final long serialVersionUID = 1L;
	
	private JMenuBar oJMenuBarPrincipal;
	
	private JMenu oJMenuFichier;
		private JMenuItem oJMenuFichierQuitter;
		
	private JMenu oJMenuAide;
		private JMenuItem oJMenuAideAPropos;

	private JToolBar oJToolbarPrincipale;
	private JButton btnPrecedent;
	private JButton btnSuivant;
	private JMenu oJMenuHistorique;
	private JMenuItem oJMenuHistorique1;
	private JMenuItem oJMenuHistorique2;
	private JMenuItem oJMenuHistorique3;
	private JMenuItem oJMenuHistorique4;
	private JMenuItem oJMenuHistorique5;
	private JMenuItem oJMenuHistoriqueComplet;
	private JSeparator separator;
	private Component horizontalStrut;
	private JButton btnToggleConEdit;
	private Component horizontalStrut_1;
	private boolean consultation = true;
	private boolean ajouterPOI = false;
	private JLabel lblConEdit;
	private Component horizontalStrut_2;
	private JTextField txtRecherche;
	private JLabel lblParcours;
	private JList listParcours;
	private JList listPOI;
	private JLayeredPane oJPanelGoogleMap;
	private JGoogleMapEditorPan googleMapEditorPan;
	private JButton btnAjouterLieu;
	private JButton btnAjouterPOI;
	private JButton btnSupprimerPOI;
	private JButton btnAjouterParcours;
	private JButton btnSupprimerParcours;
	private Vector<String> vectorListPoi = new Vector<String>();
	private JScrollPane scrollPane_1;
	private JLabel poiComp;
	private JComboBox cbbLieu;
	private JComboBox cbbTypeMap;
	private JComboBox cbbTypeRecherche;
	private JScrollPane scrollPane_2;
	private JList list_resultat;
	private Historique histPOI;
	private Vector<String> oVectorResultats = new Vector<String>();
	private String currentJlist;
	private JLabel resultat;
	private List<String> listeHistoriqueSession = new ArrayList<String>();
	private boolean dragged = false;
	private Carte carteChoisie;
	private boolean cbbLieuRemplie = false;
	private int compteurHistoriqueStatique = 0;
	/*
	 * Variables d'Ambroise
	 */
	private boolean erreurRechercheChampVide = true;
	private boolean erreurResultatRechercheVide = true;
	private JButton btnModifierCeLieu;
	private int compteurHistoriqueSession;
	private JButton btnSupprimerCeLieu;
	private boolean listResultatRechercheEnable = false;// Permet de gérer le coup des double évènements de la liste list_resultat.
	private JCheckBox chckbxNomExact;

	/**
	 * @description Constructeur principal
	 */
	public FenetrePrincipale() {
		
		// On définit par qui sont récupérés les évènements.
		defineListeners();
		
		// On définit les éléments spécifiques Ã  la fenêtre.
		defineWindowAttributes();
		
		// On construit le menu principal de la fenêtre.
		buildMainMenu();

		this.setVisible(true);
	}
	
	/**
	 * @name defineListeners
	 * @description Définit les écouteurs de la classe pour les évènements de souris, clavier et de fenêtre.
	 */
	public void defineListeners(){
		this.addWindowListener(this);
		this.addKeyListener(this);
		this.addMouseListener(this);
	}
	
	/**
	 * @name defineWindowAttributes
	 * @description Défini les attributs principaux de la fenêtre. (Nom, taille, etc.)
	 */
	public void defineWindowAttributes(){
		// On définit le titre de la fenêtre.
		this.setTitle("MiniSIG");
		
        this.setLocationRelativeTo(null);
        
        // On définit une taille de base. (La fenêtre sera automatiquement agrandie par la suite)
        this.setSize(800, 600);
        this.setMinimumSize(new Dimension(910, 800));
        this.setPreferredSize(new Dimension(800, 600));
        
        // Le bouton fermer quitte le processus.
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        // On défini la position de la fenêtre si elle est rétrécie. Au centre de l'écran. Ã€ peu près.
        this.setLocation((int)Toolkit.getDefaultToolkit().getScreenSize().getWidth()/2, (int)Toolkit.getDefaultToolkit().getScreenSize().getHeight()/6);
	}
	
	/**
	 * @name buildMainMenu
	 * @description Construit le menu principal de la fenêtre.
	 */
	public void buildMainMenu(){
		// On construit le menu principal.
		this.oJMenuBarPrincipal = new JMenuBar();
          
    	
	    // Menu déroulante de l'aide.
    	this.oJMenuAide = new JMenu("Aide");
    	
        // Ã€ propos
        this.oJMenuAideAPropos = new JMenuItem("À propos");
        this.oJMenuAideAPropos.addActionListener(this);
        
        // Menu déroulant de gestion des contacts
        this.oJMenuFichier = new JMenu("Fichier");
        
        // Quitter
        this.oJMenuFichierQuitter = new JMenuItem("Quitter");
        this.oJMenuFichierQuitter.addActionListener(this);
        this.oJMenuFichier.add(this.oJMenuFichierQuitter);
        
        // Ajout du menu au menu principal.
        this.oJMenuBarPrincipal.add(this.oJMenuFichier);
        
        oJMenuHistorique = new JMenu("Historique");
        oJMenuBarPrincipal.add(oJMenuHistorique);
        loadHistoriqueElement();
        separator = new JSeparator();
        oJMenuHistorique.add(separator);
        
        oJMenuHistoriqueComplet = new JMenuItem("Historique complet");
        oJMenuHistoriqueComplet.addActionListener(this);
        oJMenuHistorique.add(oJMenuHistoriqueComplet);
        this.oJMenuAide.add(this.oJMenuAideAPropos);
        
        // Ajout du menu au menu principal.
        this.oJMenuBarPrincipal.add(this.oJMenuAide);
	    
        // On définit notre MenuBarPrincipal comme MenuBar de la fenêtre principale.
		this.setJMenuBar(this.oJMenuBarPrincipal);
		
		oJToolbarPrincipale = new JToolBar();
		oJToolbarPrincipale.setFloatable(false);
		
		btnPrecedent = new JButton("");
		btnPrecedent.setEnabled(false);
		btnPrecedent.setFocusable(true);
		btnPrecedent.setBorder(null);
		btnPrecedent.setIcon(new ImageIcon(FenetrePrincipale.class.getResource("/ICONPREC.png")));
		btnPrecedent.addActionListener(this);
		oJToolbarPrincipale.add(btnPrecedent);
		
		horizontalStrut_1 = Box.createHorizontalStrut(10);
		oJToolbarPrincipale.add(horizontalStrut_1);
		
		btnSuivant = new JButton("");
		btnSuivant.setEnabled(false);
		btnSuivant.setFocusable(true);
		btnSuivant.setBackground(UIManager.getColor("ToolBar.dockingBackground"));
		btnSuivant.setBorder(null);
		btnSuivant.setIcon(new ImageIcon(FenetrePrincipale.class.getResource("/ICONSUIV.png")));
		btnSuivant.addActionListener(this);
		oJToolbarPrincipale.add(btnSuivant);
		
		horizontalStrut = Box.createHorizontalStrut(130);
		oJToolbarPrincipale.add(horizontalStrut);
		
		btnToggleConEdit = new JButton("");
		btnToggleConEdit.addActionListener(this);
		btnToggleConEdit.addMouseListener(this);
		btnToggleConEdit.setBorder(null);
		btnToggleConEdit.setIcon(new ImageIcon(FenetrePrincipale.class.getResource("/ICONCON.png")));
		oJToolbarPrincipale.add(btnToggleConEdit);
		
		horizontalStrut_2 = Box.createHorizontalStrut(10);
		oJToolbarPrincipale.add(horizontalStrut_2);
		
		lblConEdit = new JLabel("Lieu : ");
		oJToolbarPrincipale.add(lblConEdit);
		
		cbbLieu = new JComboBox();
		cbbLieu.setMaximumSize(new Dimension(120, 24));
		cbbLieu.addItemListener(this);
		
		oJToolbarPrincipale.add(cbbLieu);
		
		Component horizontalStrut_3 = Box.createHorizontalStrut(100);
		oJToolbarPrincipale.add(horizontalStrut_3);
		
		txtRecherche = new JTextField();
		txtRecherche.setText("Recherche");
		txtRecherche.setMaximumSize(new Dimension(100, 50));
		/*
		 * Ambroise
		 */
		// On définit les Listeners de la JTextField.
		this.txtRecherche.addMouseListener(this);
		this.txtRecherche.addKeyListener(this);
		
		/*
		 * 
		 */
		oJToolbarPrincipale.add(txtRecherche);
		txtRecherche.setColumns(10);
		
		cbbTypeRecherche = new JComboBox();
		cbbTypeRecherche.setMaximumSize(new Dimension(90, 50));
		oJToolbarPrincipale.add(cbbTypeRecherche);
		cbbTypeRecherche.addItem("POI");
		cbbTypeRecherche.addItem("Lieu");
		cbbTypeRecherche.addItem("Parcours");
		cbbTypeRecherche.addItemListener(this);
		
		JPanel panelPrincipal = new JPanel();
		panelPrincipal.setMinimumSize(new Dimension(665, 513));
		
		JLabel lblTypeMap = new JLabel("Type : ");
		
		cbbTypeMap = new JComboBox();
		cbbTypeMap.addItem("Terrain");
		cbbTypeMap.addItem("Roadmap");
		cbbTypeMap.addItem("Satellite");
		cbbTypeMap.addItem("Hybrid");
		cbbTypeMap.addItemListener(this);
		
		//Setting the Google Map up
		try {
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		JPanel oJPanelMenuGauche = new JPanel();
		oJPanelMenuGauche.setMinimumSize(new Dimension(244, 513));
		
		JLabel lblPoi = new JLabel("POI :");
		
		JSeparator separator_1 = new JSeparator();
		
		lblParcours = new JLabel("Parcours :");
		
		scrollPane_2 = new JScrollPane();
		
		resultat = new JLabel("Résultat recherche");
		resultat.setVisible(false);
		GroupLayout groupLayout = new GroupLayout(getContentPane());
		groupLayout.setHorizontalGroup(
			groupLayout.createParallelGroup(Alignment.LEADING)
				.addComponent(oJToolbarPrincipale, GroupLayout.PREFERRED_SIZE, 1920, GroupLayout.PREFERRED_SIZE)
				.addGroup(groupLayout.createSequentialGroup()
					.addGap(3)
					.addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
						.addGroup(groupLayout.createSequentialGroup()
							.addComponent(resultat, GroupLayout.PREFERRED_SIZE, 231, GroupLayout.PREFERRED_SIZE)
							.addContainerGap())
						.addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
							.addGroup(groupLayout.createSequentialGroup()
								.addComponent(scrollPane_2, GroupLayout.PREFERRED_SIZE, 885, GroupLayout.PREFERRED_SIZE)
								.addContainerGap())
							.addGroup(groupLayout.createSequentialGroup()
								.addComponent(panelPrincipal, GroupLayout.PREFERRED_SIZE, 656, GroupLayout.PREFERRED_SIZE)
								.addPreferredGap(ComponentPlacement.RELATED)
								.addComponent(oJPanelMenuGauche, GroupLayout.PREFERRED_SIZE, 232, Short.MAX_VALUE)
								.addGap(1023)))))
		);
		groupLayout.setVerticalGroup(
			groupLayout.createParallelGroup(Alignment.LEADING)
				.addGroup(groupLayout.createSequentialGroup()
					.addComponent(oJToolbarPrincipale, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
					.addPreferredGap(ComponentPlacement.RELATED)
					.addGroup(groupLayout.createParallelGroup(Alignment.TRAILING)
						.addComponent(panelPrincipal, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
						.addComponent(oJPanelMenuGauche, GroupLayout.DEFAULT_SIZE, 542, Short.MAX_VALUE))
					.addPreferredGap(ComponentPlacement.RELATED)
					.addComponent(resultat)
					.addPreferredGap(ComponentPlacement.RELATED)
					.addComponent(scrollPane_2, GroupLayout.PREFERRED_SIZE, 112, GroupLayout.PREFERRED_SIZE))
		);
		
		Component horizontalStrut_4 = Box.createHorizontalStrut(20);
		horizontalStrut_4.setPreferredSize(new Dimension(20, 0));
		oJToolbarPrincipale.add(horizontalStrut_4);
		
		chckbxNomExact = new JCheckBox("Nom exact");
		chckbxNomExact.setToolTipText("Si cochée alors seul le nom exact sera recherché, ni la description ni une partie du nom.");
		oJToolbarPrincipale.add(chckbxNomExact);
		

		list_resultat = new JList(oVectorResultats);
		list_resultat.setVisible(false);
		list_resultat.addListSelectionListener(this);
		list_resultat.addKeyListener(this);
		list_resultat.addMouseListener(this);
		scrollPane_2.setViewportView(list_resultat);
		
		btnAjouterLieu = new JButton("Ajouter un lieu");
		/*
		 * Ambroise
		 */
		this.btnAjouterLieu.addActionListener(this);
		/*
		 * Fin Ambroise
		 */
		btnAjouterLieu.setVisible(false);
		btnAjouterLieu.setEnabled(false);
		
		oJPanelGoogleMap = new JLayeredPane();
		
		btnModifierCeLieu = new JButton("Modifier ce lieu");
		btnModifierCeLieu.addActionListener(this);
		btnModifierCeLieu.setVisible(false);
		btnModifierCeLieu.setEnabled(false);
		btnModifierCeLieu.setToolTipText("Modifiez le nom et la description d'un lieu.");
		
		btnSupprimerCeLieu = new JButton("Supprimer ce lieu");
		btnSupprimerCeLieu.addActionListener(this);
		btnSupprimerCeLieu.setEnabled(false);
		btnSupprimerCeLieu.setVisible(false);
		btnSupprimerCeLieu.setToolTipText("Supprimez définitivement un lieu ainsi que tous ses parcours/Poi.");
		
		GroupLayout gl_panelPrincipal = new GroupLayout(panelPrincipal);
		gl_panelPrincipal.setHorizontalGroup(
			gl_panelPrincipal.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_panelPrincipal.createSequentialGroup()
					.addComponent(lblTypeMap, GroupLayout.PREFERRED_SIZE, 61, GroupLayout.PREFERRED_SIZE)
					.addGap(16)
					.addComponent(cbbTypeMap, GroupLayout.PREFERRED_SIZE, 88, GroupLayout.PREFERRED_SIZE)
					.addPreferredGap(ComponentPlacement.RELATED, 252, Short.MAX_VALUE)
					.addComponent(btnModifierCeLieu)
					.addPreferredGap(ComponentPlacement.RELATED)
					.addComponent(btnAjouterLieu)
					.addGap(27))
				.addGroup(gl_panelPrincipal.createSequentialGroup()
					.addComponent(oJPanelGoogleMap, GroupLayout.DEFAULT_SIZE, 646, Short.MAX_VALUE)
					.addContainerGap())
				.addGroup(Alignment.TRAILING, gl_panelPrincipal.createSequentialGroup()
					.addContainerGap(545, Short.MAX_VALUE)
					.addComponent(btnSupprimerCeLieu)
					.addGap(22))
		);
		gl_panelPrincipal.setVerticalGroup(
			gl_panelPrincipal.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_panelPrincipal.createSequentialGroup()
					.addGap(10)
					.addGroup(gl_panelPrincipal.createParallelGroup(Alignment.LEADING)
						.addComponent(lblTypeMap, GroupLayout.PREFERRED_SIZE, 24, GroupLayout.PREFERRED_SIZE)
						.addGroup(gl_panelPrincipal.createParallelGroup(Alignment.BASELINE)
							.addComponent(cbbTypeMap, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
							.addComponent(btnAjouterLieu, GroupLayout.PREFERRED_SIZE, 26, GroupLayout.PREFERRED_SIZE)
							.addComponent(btnModifierCeLieu)))
					.addPreferredGap(ComponentPlacement.RELATED)
					.addComponent(oJPanelGoogleMap, GroupLayout.PREFERRED_SIZE, 462, GroupLayout.PREFERRED_SIZE)
					.addGap(4)
					.addComponent(btnSupprimerCeLieu)
					.addContainerGap())
		);
		googleMapEditorPan = new JGoogleMapEditorPan();
		oJPanelGoogleMap.setLayer(googleMapEditorPan, 0);
		googleMapEditorPan.setBounds(0, 0, 632, 450);
		oJPanelGoogleMap.add(googleMapEditorPan);
		googleMapEditorPan.addMouseListener(this);
		googleMapEditorPan.setFocusable(false);
		googleMapEditorPan.setRoadmap("");
		googleMapEditorPan.setMinimumSize(new Dimension(630, 450));
		googleMapEditorPan.setZoom(14);
		googleMapEditorPan.setWidth(630);
		googleMapEditorPan.setHeight(450);
		panelPrincipal.setLayout(gl_panelPrincipal);
		
		btnAjouterPOI = new JButton("Ajouter");
		btnAjouterPOI.setVisible(false);
		btnAjouterPOI.setEnabled(false);
		btnAjouterPOI.addActionListener(this);
		
		btnSupprimerPOI = new JButton("Supprimer");
		btnSupprimerPOI.setVisible(false);
		btnSupprimerPOI.setEnabled(false);
		btnSupprimerPOI.addActionListener(this);
		
		btnAjouterParcours = new JButton("Ajouter");
		btnAjouterParcours.setVisible(false);
		btnAjouterParcours.setEnabled(false);
		
		btnSupprimerParcours = new JButton("Supprimer");
		btnSupprimerParcours.setVisible(false);
		btnSupprimerParcours.setEnabled(false);
		
		JScrollPane scrollPane = new JScrollPane();
		
		scrollPane_1 = new JScrollPane();
		
		
		GroupLayout gl_oJPanelMenuGauche = new GroupLayout(oJPanelMenuGauche);
		gl_oJPanelMenuGauche.setHorizontalGroup(
			gl_oJPanelMenuGauche.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_oJPanelMenuGauche.createSequentialGroup()
					.addGroup(gl_oJPanelMenuGauche.createParallelGroup(Alignment.LEADING)
						.addGroup(gl_oJPanelMenuGauche.createSequentialGroup()
							.addGap(9)
							.addComponent(lblPoi, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
							.addGap(322))
						.addGroup(gl_oJPanelMenuGauche.createSequentialGroup()
							.addContainerGap()
							.addGroup(gl_oJPanelMenuGauche.createParallelGroup(Alignment.LEADING)
								.addComponent(separator_1, GroupLayout.PREFERRED_SIZE, 224, GroupLayout.PREFERRED_SIZE)
								.addGroup(gl_oJPanelMenuGauche.createSequentialGroup()
									.addComponent(btnAjouterPOI)
									.addPreferredGap(ComponentPlacement.UNRELATED)
									.addComponent(btnSupprimerPOI))))
						.addGroup(gl_oJPanelMenuGauche.createSequentialGroup()
							.addContainerGap()
							.addComponent(scrollPane, GroupLayout.PREFERRED_SIZE, 197, GroupLayout.PREFERRED_SIZE))
						.addGroup(gl_oJPanelMenuGauche.createSequentialGroup()
							.addContainerGap()
							.addComponent(lblParcours))
						.addGroup(gl_oJPanelMenuGauche.createSequentialGroup()
							.addContainerGap()
							.addComponent(scrollPane_1, GroupLayout.PREFERRED_SIZE, 201, GroupLayout.PREFERRED_SIZE))
						.addGroup(gl_oJPanelMenuGauche.createSequentialGroup()
							.addContainerGap()
							.addComponent(btnAjouterParcours)
							.addPreferredGap(ComponentPlacement.UNRELATED)
							.addComponent(btnSupprimerParcours, GroupLayout.PREFERRED_SIZE, 107, GroupLayout.PREFERRED_SIZE)))
					.addContainerGap())
		);
		gl_oJPanelMenuGauche.setVerticalGroup(
			gl_oJPanelMenuGauche.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_oJPanelMenuGauche.createSequentialGroup()
					.addGap(11)
					.addComponent(lblPoi, GroupLayout.PREFERRED_SIZE, 26, GroupLayout.PREFERRED_SIZE)
					.addPreferredGap(ComponentPlacement.RELATED)
					.addComponent(scrollPane, GroupLayout.PREFERRED_SIZE, 158, GroupLayout.PREFERRED_SIZE)
					.addPreferredGap(ComponentPlacement.UNRELATED)
					.addGroup(gl_oJPanelMenuGauche.createParallelGroup(Alignment.BASELINE)
						.addComponent(btnAjouterPOI)
						.addComponent(btnSupprimerPOI))
					.addPreferredGap(ComponentPlacement.RELATED)
					.addComponent(separator_1, GroupLayout.PREFERRED_SIZE, 10, GroupLayout.PREFERRED_SIZE)
					.addPreferredGap(ComponentPlacement.RELATED)
					.addComponent(lblParcours, GroupLayout.PREFERRED_SIZE, 26, GroupLayout.PREFERRED_SIZE)
					.addPreferredGap(ComponentPlacement.RELATED)
					.addComponent(scrollPane_1, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
					.addPreferredGap(ComponentPlacement.UNRELATED)
					.addGroup(gl_oJPanelMenuGauche.createParallelGroup(Alignment.BASELINE)
						.addComponent(btnAjouterParcours)
						.addComponent(btnSupprimerParcours))
					.addContainerGap(53, Short.MAX_VALUE))
		);
		
		listParcours = new JList();
		scrollPane_1.setViewportView(listParcours);
		
		listPOI = new JList(vectorListPoi);
		listPOI.addListSelectionListener(this);
		listPOI.addMouseListener(this);
		scrollPane.setViewportView(listPOI);
		listPOI.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		oJPanelMenuGauche.setLayout(gl_oJPanelMenuGauche);
		getContentPane().setLayout(groupLayout);
		
		remplirCbbLieu();
		afficherLieu();		
		afficherPois(new MSG());
	}


	/*
	 * ************************************************************************************************************
	 * ************************************** Gestion des évènements **********************************************
	 * ************************************************************************************************************
	 */
	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void keyPressed(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void keyReleased(KeyEvent e) {
		Object source = e.getSource();
		char keyChar = e.getKeyChar();
		int keyCode = e.getKeyCode();
		String keyName = KeyEvent.getKeyText(e.getKeyCode());

		// Ambroise
		if(source.equals(this.txtRecherche)){
			// Si la source est l'input de recherche rapide et que la touche est entrée on effectue la recherche.
			if(keyCode == 10){
				MSG oMSG = new MSG();
				oMSG.setData("selectedItem", this.cbbTypeRecherche.getSelectedItem().toString());
				oMSG.setData("chaine", this.txtRecherche.getText());

				executerRechercheRapide(oMSG);
			}
		}else if(keyName == "F5"){
			// Eventuel rafraichissement ? Ca peut être utile. Suffit de coder :)
		}
	}

	@Override
	public void windowOpened(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowClosing(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowClosed(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowIconified(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowDeiconified(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowActivated(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowDeactivated(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}

	
	
	@Override
	public void mouseClicked(MouseEvent e) {
		Object source = e.getSource();
		if (source == googleMapEditorPan && !consultation && ajouterPOI)
		{
			this.ajouterPoi(e);
			googleMapEditorPan.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
			ajouterPOI = false;
			btnAjouterPOI.setText("Ajouter");
			afficherLieu();
			afficherPois(new MSG());

		}
		// Ambroise
		else if(source.equals(this.txtRecherche)){
			// Si le texte est celui par défaut on le supprime.
			if(this.txtRecherche.getText().equals("Recherche")){
				this.txtRecherche.setText("");
			}
		}else if(source == this.list_resultat){
			// Sinon, si l'action courante est une recherche rapide.
			selectTypeLoadForRecherch();
		}else if(source == listPOI){
			// Cette méthode reprend celle écrite par Julien, 
			if (listPOI.getSelectedIndex() != -1){
				MSG oMSG = new MSG();
				Poi oPOI = new Poi();
				//Changes the icon of the selected ID
				oMSG.setData("method", "findByName");
				oMSG.setData("chaine", listPOI.getSelectedValue());
				oMSG = oPOI.find(oMSG);
				
				oPOI = (Poi) oMSG.getData("donnees");
				oMSG.setData("POI", oPOI);
				oMSG.setData("typeDonnees", "poi");
				oMSG.setData("typePoi", "poiselect");
				oMSG.setData("POID", oPOI.getIdPoi());
				
				// On enregistre pas dans l'historique car il y a déjà un autre évènement qui le fait et ça crée un conflit.
				// De plus c'est inutile puisque l'utilisateur souhaite juste rafraîchir.
				afficherLieu();
				afficherPois(oMSG);
			}
		}
	}

	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		Object source = e.getSource();
		if (source == btnToggleConEdit) {
			e.getComponent().setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
		}	
	}

	@Override
	public void mouseExited(MouseEvent e) {
		Object source = e.getSource();
		if (source == btnToggleConEdit) {
			e.getComponent().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
		}
		
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		Object source = e.getSource();
		
		//Toggle between Consultation and Edition mode.
		if (source == btnToggleConEdit)
		{
			if (consultation)
			{
				
				//Changing the button icon
				btnToggleConEdit.setIcon(new ImageIcon(FenetrePrincipale.class.getResource("/ICONEDIT.png"))); 
				
				//Displays and enables editing buttons.
				btnAjouterLieu.setVisible(true);
				btnAjouterLieu.setEnabled(true);
				
				btnAjouterPOI.setVisible(true);
				btnAjouterPOI.setEnabled(true);
				
				btnSupprimerPOI.setVisible(true);
				btnSupprimerPOI.setEnabled(true);
				
				btnAjouterParcours.setVisible(true);
				btnAjouterParcours.setEnabled(true);
				
				btnSupprimerParcours.setVisible(true);
				btnSupprimerParcours.setEnabled(true);
				
				btnAjouterLieu.setVisible(true);
				btnAjouterLieu.setEnabled(true);
				
				// ************************ Ambroise ************************ 
				this.btnModifierCeLieu.setVisible(true);
				this.btnModifierCeLieu.setEnabled(true);
				
				this.btnSupprimerCeLieu.setVisible(true);
				this.btnSupprimerCeLieu.setEnabled(true);
				// ************************ Fin Ambroise ************************ 
				
				//Set consultation boolean to false
				consultation = false;
				
			} else {
				
				
				btnToggleConEdit.setIcon(new ImageIcon(FenetrePrincipale.class.getResource("/ICONCON.png"))); 
				
				//Hides and disables editing buttons.
				btnAjouterPOI.setVisible(false);
				btnAjouterPOI.setEnabled(false);
				
				btnSupprimerPOI.setVisible(false);
				btnSupprimerPOI.setEnabled(false);

				btnAjouterParcours.setVisible(false);
				btnAjouterParcours.setEnabled(false);			

				btnSupprimerParcours.setVisible(false);
				btnSupprimerParcours.setEnabled(false);
				
				btnAjouterLieu.setVisible(false);
				btnAjouterLieu.setEnabled(false);
				
				// ************************ Ambroise ************************ 
				this.btnModifierCeLieu.setVisible(false);
				this.btnModifierCeLieu.setEnabled(false);
				
				this.btnSupprimerCeLieu.setVisible(false);
				this.btnSupprimerCeLieu.setEnabled(false);
				// ************************ Fin Ambroise ************************ 
				
				consultation = true;
			}
		}else if (source == btnAjouterPOI){
			if (!ajouterPOI){
				//Changes the cursor to a crosshair
				googleMapEditorPan.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
				ajouterPOI = true;
				btnAjouterPOI.setText("Annuler");
			}else {
				//Puts the cursor back to normal
				googleMapEditorPan.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
				ajouterPOI = false;
				btnAjouterPOI.setText("Ajouter");
			}
		} else if(source == btnSupprimerPOI) {
			if (listPOI.getSelectedIndex() != -1) {
				supprimerPoi();
			}
		}

		//Adel impléments

		else if (source == oJMenuHistoriqueComplet){
			try{
				resultat.setVisible(true);
				resultat.setText("<html><body><u><span style='color: blue;'>Historique :</span></u></body></html>");
				this.oVectorResultats.clear();
				MSG oMSG = new MSG();
				histPOI = new Historique();
				//Send the message with no value make a "SELECT *"
				oMSG = histPOI.find(oMSG);
				
				//Test du types de données retourné par le DAO
				if(oMSG.getData("typeDonnees") == "list")
				{
					List<Poi> listePoi = (List<Poi>) oMSG.getData("donneesS");
					List<Historique> listeHistorique = (List<Historique>) oMSG.getData("donnees");
					//utilise un foreach pour récupérer le nom des POI de manière dynamique
					for (int i =0; i  < listePoi.size(); i++) {
						oVectorResultats.addElement(listePoi.get(i).getNom() + " - " + listeHistorique.get(i).getDateVisite());
					}	
				}
				else if(oMSG.getData("typeDonnees") == "object"){
					Poi poi = (Poi) oMSG.getData("donnesS");
					histPOI = (Historique) oMSG.getData("donnees");
					
					oVectorResultats.addElement(poi.getNom() + " - " + histPOI.getDateVisite());
				}
				else if(oMSG.getData("typeDonnees") == "null"){
					oVectorResultats.addElement("Aucun POI dans l'historique.");
				}
				

			}catch (Exception e2) {
				e2.printStackTrace();
			}
			
			//update du contenu de la list
			list_resultat.updateUI();
			list_resultat.setVisible(true);
			currentJlist = "Historique :";
			
		}
		else if (source == btnPrecedent || source == btnSuivant){
			MSG oMSG = new MSG();
			oMSG.setData("source", source);
			btnCliquer(oMSG);
		}
		// ************************ Ambroise ************************ 
		else if(source == this.oJMenuFichierQuitter){
			// Si la source est le bouton quitter du menu on ferme le programme.
			System.exit(0);
		}else if(source == this.btnAjouterLieu && this.consultation == false){
			// Si la source est le bouton "Ajouter un lieu" alors on affiche la JDialogAddLieu.
			DialogAddLieu oDialogAddLieu = new DialogAddLieu();
			oDialogAddLieu.setVisible(true);
			
			// Une fois la map ajoutée.
			remplirCbbLieu();
			afficherLieu();
			afficherPois(new MSG());
			
		}else if(source == this.btnModifierCeLieu  && this.consultation == false){
			DialogUpdateLieu oDialogUpdateLieu = new DialogUpdateLieu(new MSG("carte", this.carteChoisie));
			oDialogUpdateLieu.setVisible(true);
			
			// Une fois la map ajoutée on sauvegarde en local le nom de la carte actuelle.
			String nomCarteActuelle = this.carteChoisie.getNom();
			
			// Puis on rafraichit la comboboxLieu pour mettre à jour d'un éventuel changement de nom.
			remplirCbbLieu();
			afficherLieu();
			afficherPois(new MSG());
			
			// Et enfin on change l'item sélectionné en passant le nom conservé. (La liste ayant été redéfinie l'index a changé entre temps)
			this.cbbLieu.setSelectedItem(nomCarteActuelle);
		}else if(source == this.btnSupprimerCeLieu){
			int choix = JOptionPane.showConfirmDialog(this, "Voulez-vous vraiment supprimer ce lieu et tous ses Poi ainsi que ses parcours ?\n<html><body><span style='color:red;'>Ce choix est définitif.</span></body></html>", "Êtes-vous sûr ?", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
			if(choix == 0){
				// Si le choix est "Oui" on supprime le lieu en cours.
				supprimerLieuCourant();
			}
		}
		// ************************ Fin Ambroise. ************************ 
		// Adel
		else if (source == oJMenuHistorique1){
			MSG oMSG = new MSG();
			oMSG.setData("chaine", oJMenuHistorique1.getText());
			System.out.println();
			//Envoi à la methode chargé de l'affichage
			loadPoi(oMSG);
			addPoiHistorique(oMSG);
		}
		else if (source == oJMenuHistorique2){
			MSG oMSG = new MSG();
			oMSG.setData("chaine", oJMenuHistorique2.getText());
			//Envoi à la methode chargé de l'affichage
			loadPoi(oMSG);
		}
		else if (source == oJMenuHistorique3){
			MSG oMSG = new MSG();
			oMSG.setData("chaine", oJMenuHistorique3.getText());
			//Envoi à la methode chargé de l'affichage
			loadPoi(oMSG);
		}
		else if (source == oJMenuHistorique4){
			MSG oMSG = new MSG();
			oMSG.setData("chaine", oJMenuHistorique4.getText());
			//Envoi à la methode chargé de l'affichage
			loadPoi(oMSG);
		}
		else if (source == oJMenuHistorique5){
			MSG oMSG = new MSG();
			oMSG.setData("chaine", oJMenuHistorique5.getText());
			//Envoi à la methode chargé de l'affichage
			loadPoi(oMSG);
		}
		
	}
	
	@Override
	public void valueChanged(ListSelectionEvent e) {
		// TODO Auto-generated method stub
		Object source = e.getSource();
		if(source == listPOI && !e.getValueIsAdjusting()){
			if (listPOI.getSelectedIndex() != -1){
				MSG oMSG = new MSG();
				Poi oPOI = new Poi();
				//Changes the icon of the selected ID
				oMSG.setData("method", "findByName");
				oMSG.setData("chaine", listPOI.getSelectedValue());
				oMSG = oPOI.find(oMSG);
				
				oPOI = (Poi) oMSG.getData("donnees");
				oMSG.setData("POI", oPOI);
				oMSG.setData("typeDonnees", "poi");
				oMSG.setData("typePoi", "poiselect");
				oMSG.setData("POID", oPOI.getIdPoi());
				
				addPoiHistorique(oMSG);
				afficherLieu();
				afficherPois(oMSG);
			}
		}
		//Ici On gère l'évènement sur laJlist "list_resultat" lorsque le contenu est un Historique
		else if(source == list_resultat){
			// Si l'action courante est d'afficher l'historique alors on cherche le Poi.
			if(currentJlist == "Historique :"){
				//Dans le cas ou Aucun POI n'est selectionné
				if(list_resultat.getSelectedIndex() == -1){
					System.out.println("No selection Historique.");
				}
				//Sinon on récupère le nom du POI selectionné
				else{
					MSG oMSG = new MSG();

					//On stock le Nom du POI selectionné
					oMSG.setData("chaine", list_resultat.getSelectedValue());
					//Envoi à la methode chargé de l'affichage
					loadPoi(oMSG);
				}
			}
			// ************ Ambroise ************
			else if(currentJlist == "Résultats de la recherche :"){
				// Sinon, si l'action courante est une recherche rapide.
				selectTypeLoadForRecherch();
			}
		}
		
	}
	
	@Override
	public void itemStateChanged(ItemEvent arg0) {
		Object source = arg0.getSource();
		if (source == cbbLieu  && cbbLieu.getSelectedItem() != null) {
			MSG oMSG = new MSG();
			Carte oCarte = new Carte();
			
			//Getting the current map's ID
			oMSG.setData("method", "findByName");
			oMSG.setData("chaine", cbbLieu.getSelectedItem().toString());
			oMSG = oCarte.find(oMSG);
			String type = oMSG.getData("typeDonnees").toString();
			if(type.equals("object")){
				carteChoisie = (Carte) oMSG.getData("donnees");
				System.out.println(carteChoisie.toString());
			}
			
			if (cbbLieuRemplie) {
				//Reloads the map and its POIs only if cbbList has been completely filled
				afficherLieu();
				afficherPois(new MSG());
				listPOI.updateUI();
			}	
		} else if (source == cbbTypeMap) {
			try {
				googleMapEditorPan.refresh(new MSG("roadmap",cbbTypeMap.getSelectedItem().toString().toLowerCase()));
			} catch (Exception e) {
				e.printStackTrace();
			}
		}else if(source == this.cbbTypeRecherche){
			if(!this.txtRecherche.getText().isEmpty() && !this.txtRecherche.getText().equals("Recherche")){
				MSG oMSG = new MSG();
				oMSG.setData("selectedItem", this.cbbTypeRecherche.getSelectedItem().toString());
				oMSG.setData("chaine", this.txtRecherche.getText());

				executerRechercheRapide(oMSG);
			}
		}
	}
	
	/*************************************************************************************
	 ****************************** Ambrosius's Méthods **********************************
	 ************************************************************************************/
	
	/**
	 * @name executerRechercheRapide
	 * @description Exécute la recherche rapide.
	 * @param 	MSG oMSG: "chaine": Chaine Ã  rechercher.
	 * 					  "selectedItem": Choix du type de recherche (POI, Lieu, Parcours)
	 * @author Ambroise
	 */	
	private void executerRechercheRapide(MSG oMSG){
		// On met à jour la variable qui définit qui utilise la list_resultat. 
		this.currentJlist = "Résultats de la recherche :";
		this.resultat.setText("<html><body><u><span style='color:green;'>Résultat(s) de la recherche :</span></u></body></html>");
		this.resultat.setVisible(true);
		
		String chaine = (String) oMSG.getData("chaine");
		Object selectedItem = oMSG.getData("selectedItem");
		
		if(!chaine.trim().isEmpty()){
			IPersistance classePersistante = null;
			if(selectedItem.equals("POI")){
				classePersistante = new Poi();
			}else if(selectedItem.equals("Lieu")){
				classePersistante = new Carte();
			}else if(selectedItem.equals("Parcours")){
				classePersistante = new Parcours();
			}
			
			oMSG = new MSG(); 
			// En fonction de la chckbxNomExact on effectue une recherche par nom ou par (une partie du) nom et descriptif.
			if(this.chckbxNomExact.isSelected()){
				oMSG.setData("method", "findByName");
			}else{
				oMSG.setData("method", "findByNameOrDescriptif");
			}
			oMSG.setData("chaine", chaine);
			oMSG = classePersistante.find(oMSG);

			if(oMSG.getData("typeDonnees") == "list"){
				// On efface le vecteur.
				this.oVectorResultats.clear();
								
				if(selectedItem.equals("POI")){
					// On stocke la liste d'objets.
					List<Poi> list = null;
					list = (ArrayList<Poi>) oMSG.getData("donnees");
					
					// Pour chaque élément de la liste on l'ajoute dans le vecteur.
					for (Poi poi : list) {
						this.oVectorResultats.addElement(poi.getNom()+" - "+poi.getDescriptif());
					}
				}else if(selectedItem.equals("Lieu")){
					// On stocke la liste d'objets.
					List<Carte> list = null;
					list = (ArrayList<Carte>) oMSG.getData("donnees");
					
					// Pour chaque élément de la liste on l'ajoute dans le vecteur.
					for (Carte carte : list) {
						this.oVectorResultats.addElement(carte.getNom()+" - "+carte.getDescriptif());
					}
				}else if(selectedItem.equals("Parcours")){
					// On stocke la liste d'objets.
					List<Parcours> list = null;
					list = (ArrayList<Parcours>) oMSG.getData("donnees");
					
					// Pour chaque élément de la liste on l'ajoute dans le vecteur.
					for (Parcours parcours : list) {
						System.out.println(parcours.getNom());
						this.oVectorResultats.addElement(parcours.getNom()+" - "+parcours.getDescriptif());
					}
				}

				// On force l'affichage de la liste.
				this.list_resultat.updateUI();
				this.list_resultat.setVisible(true);

			}else if(oMSG.getData("typeDonnees") == "object"){
				// On efface le vecteur.
				this.oVectorResultats.clear();
								
				if(selectedItem.equals("POI")){
					Poi poi = (Poi) oMSG.getData("donnees");
					this.oVectorResultats.addElement(poi.getNom()+" - "+poi.getDescriptif());
				}else if(selectedItem.equals("Lieu")){
					Carte carte = (Carte) oMSG.getData("donnees");
					this.oVectorResultats.addElement(carte.getNom()+" - "+carte.getDescriptif());
				}else if(selectedItem.equals("Parcours")){
					Parcours parcours = (Parcours) oMSG.getData("donnees");
					this.oVectorResultats.addElement(parcours.getNom()+" - "+parcours.getDescriptif());
				}
				
				// On force l'affichage de la liste.
				this.list_resultat.updateUI();
				this.list_resultat.setVisible(true);
				

			}else if(oMSG.getData("typeDonnees") == "null"){
				if(this.erreurResultatRechercheVide){
					this.list_resultat.updateUI();
					this.list_resultat.setVisible(false);// On n'affiche pas la liste.
					
					JOptionPane.showMessageDialog(null, "La recherche n'a retourné aucun résultat.\nRecherche effectuée dans " + selectedItem +" pour la chaine:\n"+ chaine + ".", "Pas de résultat", JOptionPane.INFORMATION_MESSAGE);
					this.erreurResultatRechercheVide = false;
				}else{
					this.erreurResultatRechercheVide = true;
				}
			}
		
		}else{
			if(this.erreurRechercheChampVide){
				JOptionPane.showMessageDialog(null, "Le champ de recherche ne doit pas être vide !", "Champ vide", JOptionPane.INFORMATION_MESSAGE);
				this.erreurRechercheChampVide = false;
			}else{
				this.erreurRechercheChampVide = true;
			}
		}
	}
	
	/**
	 * @name supprimerLieuCourant
	 * @description Supprime le lieu en cours d'utilisation.
	 */
	public void supprimerLieuCourant(){
		try{// On instancie nos messages pour chaque classe qui va avoir besoind 'utiliser la méthode de suppression.
			MSG oMSG = new MSG();
			oMSG.setData("method", "findByCarteId");
			oMSG.setData("carteId", this.carteChoisie.getIdCarte());
			
			// On récupère tous les Poi de cette carte.
			oMSG = new Poi().find(oMSG);
			
			List<Poi> listePoi = new ArrayList<Poi>();
			
			if(oMSG.getData("typeDonnees") != null){
				// Si la carte possède au moins un Poi.
				if(oMSG.getData("typeDonnees") == "object"){
					// On met le Poi dans notre liste.
					listePoi.add((Poi) oMSG.getData("donnees"));
				}else if(oMSG.getData("typeDonnees") == "list"){
					// On met la liste dans l'autre.
					listePoi = (List<Poi>) oMSG.getData("donnees");
				}
				
				int nbPoi = listePoi.size();
				
				// Pour chaque Poi on supprime tout son Historique, ses parcours puis le POI en lui même.
				for(int i = 0; i < nbPoi; i++){
					oMSG = new MSG("id", listePoi.get(i).getIdPoi());
					oMSG.setData("method", "deleteByIdPoi");
					
					// On supprime l'historique.
					new Historique().delete(oMSG);
					// On supprime les appartenance de ce Poi aux parcours.
					new Parcours_Poi().delete(oMSG);
					oMSG.setData("method", "deleteById");
					// On supprime le Poi.
					new Poi().delete(oMSG);
				}
			}
			
			// On supprime la carte pour finir.
			new Carte().delete(new MSG("id", this.carteChoisie.getIdCarte()));
			
			// On rafraichit la carte.
			remplirCbbLieu();
			afficherLieu();
			afficherPois(new MSG());
			
			// On affiche un message d'information.
			JOptionPane.showMessageDialog(null, "Le lieu est ses Poi/Parcours ont bien été supprimés.", "Lieu supprimé", JOptionPane.INFORMATION_MESSAGE);
		}catch (Exception e) {
			JOptionPane.showMessageDialog(null, "Une erreur est survenue lors de la suppression du lieu.\nMessage d'erreur:\n"+e.getMessage(), "Erreur lors de la suppression !", JOptionPane.ERROR_MESSAGE);
		}
		
	}
	
	/**
	 * @name loadParcours
	 * @description Charge un parcours en fonction des paramètres du MSG.
	 */
	public void loadParcours(MSG oMSG){
		// Les parcours n'ayant pas encore été implémentés on affiche un message d'information.
		JOptionPane.showMessageDialog(null, "Les parcours n'ayant pas encore été implémentés, cette fonction a été désactivée.", "Fonction recherche de parcours non activée", JOptionPane.INFORMATION_MESSAGE);
	}
	
	/**
	 * @name selectTypeLoadForRecherch
	 * @description Effectue les vérifications afin de sélectionner la bonne méthode en fonction des paramètres de la recherche rapide.
	 */
	private void selectTypeLoadForRecherch(){
		if(this.listResultatRechercheEnable){
			// Les évènements sur cette liste étant effectués deux fois (une fois lors du clic et une fois lors du déclic (appui/relachement)) on n'en effectue qu'un.
			this.listResultatRechercheEnable = false;
			
			// On récupère le texte de l'élément actuellement sélectionné (qui est aussi celui sur lequel on a cliqué).			
			String nom = (String) list_resultat.getSelectedValue();
			
			// On découpe la chaine pour ne garder que le nom.
			String[] arrNom = nom.split("-");
			nom = arrNom[0].trim();
			
			MSG oMSG = new MSG("chaine", nom);
			
			// En fonction du type d'élément recherché.
			if(this.cbbTypeRecherche.getSelectedItem() == "POI"){				
				// Envoi à la méthode chargée de l'affichage.
				loadPoi(oMSG);
				
			}else if(this.cbbTypeRecherche.getSelectedItem() == "Lieu"){
				// On récupère la map à afficher grâce à son nom.
				oMSG.setData("method", "findByName");
				
				oMSG = this.carteChoisie.find(oMSG);
				oMSG.setData("id", ((Carte)oMSG.getData("donnees")).getIdCarte());
				
				// Envoi à la méthode chargée de l'affichage.
				loadMap(oMSG);
				
			}else if(this.cbbTypeRecherche.getSelectedItem() == "Parcours"){
				// Envoi à la méthode chargée de l'affichage.
				loadParcours(oMSG);
				
			}
		}else{
			// Si la recherche est pas activée, on l'active.
			this.listResultatRechercheEnable = true;
		}
	}
	/*************************************************************************************
	 ****************************** Fin Ambrosius's Méthods ******************************
	 ************************************************************************************/
	
	//-------------------------------------------------------------------------------------------------
	//-----------------------------------Marvin's Methods----------------------------------------------
	//-------------------------------------------------------------------------------------------------
	
	/**
	 * @author marvin
	 * @description Displays the actually selected map.
	 */
	public void afficherLieu() {
		oJPanelGoogleMap.removeAll();
		googleMapEditorPan = new JGoogleMapEditorPan();
		oJPanelGoogleMap.setLayer(googleMapEditorPan, 0);
		googleMapEditorPan.setBounds(0, 0, 632, 450);
		oJPanelGoogleMap.add(googleMapEditorPan);
		googleMapEditorPan.addMouseListener(this);
		googleMapEditorPan.setFocusable(false);
		googleMapEditorPan.setMinimumSize(new Dimension(630, 450));
		googleMapEditorPan.setZoom(14);
		googleMapEditorPan.setWidth(630);
		googleMapEditorPan.setHeight(450);
		try {
			googleMapEditorPan.getMapByUrl(new MSG("url",carteChoisie.getUrl()));
			googleMapEditorPan.refresh(new MSG("roadmap",cbbTypeMap.getSelectedItem().toString().toLowerCase()));
			System.out.println(googleMapEditorPan.getZoom());
		} catch (Exception e1) {
			e1.printStackTrace();
		}
	}
	
	
	/**
	 * @author marvin
	 * @description Used to fill cbbLieu with all the maps in the DB.
	 */
	public void remplirCbbLieu() {
		//Sets cbbLieu as not filled and clears its content
		cbbLieuRemplie = false;
		cbbLieu.removeAllItems();
		
		MSG oMSG = new MSG();
		Carte oCarte = new Carte();
		List<Carte> oList = new ArrayList<Carte>();
		
		oMSG.setData("method", "findAll");
		oMSG = oCarte.find(oMSG);
		String type = oMSG.getData("typeDonnees").toString();
		if(type.equals("object")){
			oList.add((Carte)oMSG.getData("donnees"));
		} else if(type.equals("list")){
			oList = (ArrayList<Carte>) oMSG.getData("donnees");
		}
		
		Iterator i = oList.iterator();
		while (i.hasNext()) {
			oCarte = (Carte) i.next();
			cbbLieu.addItem(oCarte.getNom());
		}
		cbbLieuRemplie = true;
	}
	
	/**
	 * @author marvin
	 * @description Updates the location of a POI in the DB.
	 * @param oMSG - "POI" contains the component corresponding to the POI to update
	 */
	public void modifierPoiPosition(MSG oMSG) {
		Poi oPoi = new Poi();
		JLabel lblPOI = (JLabel) oMSG.getData("POI");
		
		oMSG.setData("X", lblPOI.getX());
		oMSG.setData("Y", lblPOI.getY());
		oMSG.setData("id", lblPOI.getName());
		oPoi.update(oMSG);
	}
	
	/**
	 * @author marvin
	 * @description Deletes the currently selected POI
	 */
	public void supprimerPoi() {
		Poi oPoi = new Poi();
		MSG oMSG = new MSG();
		Parcours_Poi oPP = new Parcours_Poi();
		Historique oHist = new Historique();
		
		//Finding the ID of the selected POI
		oMSG.setData("method", "findByName");
		oMSG.setData("chaine", listPOI.getSelectedValue());
		oMSG = oPoi.find(oMSG);
		oPoi = (Poi) oMSG.getData("donnees");
		
		//Deletes associated Historiques & Parcours
		oMSG.setData("method", "deleteByIdPoi");
		oMSG.setData("id", oPoi.getIdPoi());
		oPP.delete(oMSG);
		oHist.delete(oMSG);
		
		//Deleting the selected POI
		oMSG.setData("method", "deleteById");
		oMSG.setData("id", oPoi.getIdPoi());
		oPoi.delete(oMSG);
		
		afficherLieu();
		afficherPois(new MSG());
	}
	
	/**
	 * @author marvin
	 * @description Add a POI where the user clicked.
	 * @param e MouseEvent. May change to MSG containing the coordinates in future updates.
	 */
	public void ajouterPoi(MouseEvent e){
		
		MSG oMSG = new MSG();
		Poi oPoi = new Poi();		
		
		//Appending a new POI in the DB
		oMSG.setData("method", "insert");
		oMSG.setData("ID_IMAGE", "1");
		oMSG.setData("ID_CARTE", carteChoisie.getIdCarte());
		oMSG.setData("NOM", "");
		oMSG.setData("DESCRIPTIF", "");
		oMSG.setData("X", e.getX()-9);
		oMSG.setData("Y", e.getY()-32);
		SimpleDateFormat formater = new SimpleDateFormat("yy-MM-dd HH:mm:ss"); 
		Date date = new Date(); 
		oMSG.setData("DATE_CREATION", formater.format(date));
		oMSG.setData("DATE_MODIFICATION", formater.format(date));
		oMSG = oPoi.insert(oMSG);
		
		oMSG.setData("method", "findById");
		oMSG.setData("id", oMSG.getData("donnees"));
		oMSG = oPoi.find(oMSG);
		
		oPoi = (Poi) oMSG.getData("donnees");
		oMSG.setData("POI", oPoi);
		oMSG.setData("type", "poi");
		oMSG = afficherUnPoi(oMSG);
		JLabel lblPOI = (JLabel) oMSG.getData("POI");
		
		DialogDetailsPOI oDetail = new DialogDetailsPOI(lblPOI);
		oDetail.setVisible(true);

	}
	
	/**
	 * @author marvin
	 * @description Process displaying all the POIs according to the selected map in the cbbLieu.
	 * @param MSG "POI" with the POI or list of POIs to display with a different icon.
	 * 			  "typeDonnees" beeing "list" or "poi".
	 * 			  "typePoi" beeing "poiselect" or "parcours" ("poi" shouldn't be used as a type as the default icon should apply to them).
	 */
	public void afficherPois(MSG oMSGPOI){
		
		vectorListPoi.clear();
		
		MSG oMSG = new MSG();
		Poi oPOI = new Poi();
		List oList = new ArrayList();
		
		//Getting all the POIs associated with the map
		oMSG = new MSG();
		oMSG.setData("method", "findByCarteId");
		oMSG.setData("carteId", carteChoisie.getIdCarte());
		oMSG = oPOI.find(oMSG);
		String type = oMSG.getData("typeDonnees").toString();
		if (!type.equals("null")) {
			if(type.equals("object")){
				oPOI = (Poi) oMSG.getData("donnees");
				oList.add(oPOI);
			} else if(type.equals("list")){
				oList = (ArrayList) oMSG.getData("donnees");
			}
				

			Iterator i = oList.iterator();
			
			while (i.hasNext()){
				MSG oMSGPARAM = new MSG();
				oPOI = (Poi) i.next();
				oMSGPARAM.setData("POI", oPOI);
				oMSGPARAM.setData("type", "poi");
				//Checks whether a MSG is used to highlight some POIs or not
				if (oMSGPOI.getData("POI") != null && oMSGPOI.getData("typeDonnees") != null && oMSGPOI.getData("typePoi") != null) {
					if (oMSGPOI.getData("typeDonnees") == "list") {
						List poiList = (List) oMSGPOI.getData("POI");
						Iterator o = poiList.iterator();
						while (o.hasNext()) {
							Poi nPoi = (Poi) o.next();
							if (oPOI.getNom().equals(nPoi.getNom())) {
								oMSGPARAM.setData("type", oMSGPOI.getData("typePoi"));
							}
						}	
					} else {
						Poi nPoi = (Poi) oMSGPOI.getData("POI");
						if (oPOI.getNom().equals(nPoi.getNom())){
							oMSGPARAM.setData("type", oMSGPOI.getData("typePoi"));
						}
					}
				}
				afficherUnPoi(oMSGPARAM);
				
				
			}
		}
	}
	
	/**
	 * @author marvin
	 * @description Displays a POI by generating a Label a the right coordinates in the oJPanelGoogleMap.
	 * @param oMSG - "POI" containing the POI to display.
	 * 				 "type" containing the type of the POI ("poi", "poiselect" or "parcours" only)
	 * @return oMSG - "POI" is the JLabel representing the new POI
	 */
	public MSG afficherUnPoi(MSG oMSG){
		
		if (oMSG.getData("type") != null || oMSG.getData("POI") != null) {
			
			Poi oPOI = (Poi) oMSG.getData("POI");
			
			//Selecting the icon to display depending on the type of POI
			if (oMSG.getData("type") == "parcours"){
				poiComp = new JLabel(new ImageIcon(FenetrePrincipale.class.getResource("/ICONPOIPARCOURS2.png")));
			} else if(oMSG.getData("type") == "poiselect"){
				poiComp = new JLabel(new ImageIcon(FenetrePrincipale.class.getResource("/ICONPOISELECT2.png")));
			} else {
				poiComp = new JLabel(new ImageIcon(FenetrePrincipale.class.getResource("/ICONPOI2.png")));
			}
			
			poiComp.setBounds(oPOI.getX().intValue(), oPOI.getY().intValue(), 19, 32);
			poiComp.setVisible(true);
			poiComp.setToolTipText(oPOI.getNom());
			poiComp.setName(oPOI.getIdPoi().toString());
			poiComp.addMouseMotionListener(new MouseMotionListener() {	
				@Override
				public void mouseMoved(MouseEvent arg0) {}		
				@Override
				public void mouseDragged(MouseEvent arg0) {
					if (!consultation) {
						//Makes the component follow the mouse.
						arg0.getComponent().setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
						int x = arg0.getComponent().getLocation().x+arg0.getX()-10;
						int y = arg0.getComponent().getLocation().y+arg0.getY()-9;
						arg0.getComponent().setBounds(x, y, 19, 32);
						oJPanelGoogleMap.moveToFront(arg0.getComponent());
						dragged = true;
					}
				}
			});
			poiComp.addMouseListener(new MouseListener() {
				
				@Override
				public void mouseReleased(MouseEvent arg0) {
					if (dragged) {
						//updates the component's location by sending the component to modifierPoiPosition
						MSG oMSG = new MSG();
						oMSG.setData("POI", arg0.getComponent());
						modifierPoiPosition(oMSG);
						arg0.getComponent().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
						dragged = false;
					}
				}
				
				@Override
				public void mousePressed(MouseEvent arg0) {
				}
				
				@Override
				public void mouseExited(MouseEvent arg0) {
					arg0.getComponent().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
				}
				
				@Override
				public void mouseEntered(MouseEvent arg0) {
					arg0.getComponent().setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
				}
				
				@Override
				public void mouseClicked(MouseEvent arg0) {
					if (arg0.getButton() == MouseEvent.BUTTON1) {
						//Allow consulting and editing POIs details
						JLabel o = (JLabel)arg0.getComponent();
						DialogDetailsPOI oDetail = new DialogDetailsPOI(o);
						oDetail.setVisible(true);
						afficherLieu();//Refresh the map & POIs on the main window
						afficherPois(new MSG());
						//Ajout du POI dans l'historique
						MSG oMSGHist = new MSG();
						oMSGHist.setData("POID",arg0.getComponent().getName());
						addPoiHistorique(oMSGHist);
						
					}
				}
			});
			
			oJPanelGoogleMap.add(poiComp, new Integer(1), 0);
			oJPanelGoogleMap.moveToFront(poiComp);
			vectorListPoi.add(oPOI.getNom());
			listPOI.updateUI();
			oMSG.setData("POI", poiComp);
		}
		return oMSG;
	}

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Adel ~ Methodes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~	
	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	
	/**
	 * @author adel
	 * @description : Enregistre les POI cliqués dans l'historique. Fonction utilisé pour les boutons précèdent et suivant.
	 * @param msg
	 * @fonctionnement : necessite la source du bouton précèdent ou suivant pour connaitre le poi à cliquer
	 */
	public void  btnCliquer(MSG msg)
	{
		MSG oMSG = new MSG();
		//Test de qui est l'appelant
		if(msg.getData("source") == btnPrecedent)
		{	
			if(compteurHistoriqueSession == 2){
				btnPrecedent.setEnabled(false);
			}
			btnSuivant.setEnabled(true);
			compteurHistoriqueSession--;
			oMSG.setData("id",listeHistoriqueSession.get(compteurHistoriqueSession-1));
			oMSG.setData("methodchange", 1);
			loadPoi(oMSG);
			
		}
		else if(msg.getData("source") == btnSuivant)
		{
			if(compteurHistoriqueSession == listeHistoriqueSession.size()-1){
				btnSuivant.setEnabled(false);
			}
			btnPrecedent.setEnabled(true);
			compteurHistoriqueSession++;
			oMSG.setData("id",listeHistoriqueSession.get(compteurHistoriqueSession-1));
			oMSG.setData("methodchange", 1);
			loadPoi(oMSG);
			

		}
	}
	/** 
	 * @author : adel
	 * @description : Cette méthode charge les éléments de l'onglet Historique du menu.
	 * @param : Aucun
	 * @fonctionnement : Réagira différemment selon le nombre de résultats retournés par la base de données
	 * 
	 */
	public void loadHistoriqueElement(){
		try{
			MSG oMSG = new MSG();
		    histPOI = new Historique();
		    oMSG.setData("method", "findLastVisites");
		    oMSG = histPOI.find(oMSG);
		    if(oMSG.getData("typeDonnees") == "list")
			{
			    List<Poi> listePoi = (List<Poi>) oMSG.getData("donneesS");
			    System.out.println(listePoi.size());
				switch (listePoi.size()){
				case 5 :
					if(oJMenuHistorique5 ==null){
						oJMenuHistorique5 = new JMenuItem(listePoi.get(0).getNom());
						oJMenuHistorique.add(oJMenuHistorique5);
						oJMenuHistorique5.addActionListener(this);
					}
					else{
						oJMenuHistorique5.setText(listePoi.get(0).getNom());
					}
				case 4 : 
					if(oJMenuHistorique4 ==null){
						oJMenuHistorique4 = new JMenuItem(listePoi.get(1).getNom());
					    oJMenuHistorique.add(oJMenuHistorique4);
					    oJMenuHistorique4.addActionListener(this);
					}
					else{
						oJMenuHistorique4.setText(listePoi.get(1).getNom());
					}
				case 3 : 
					if(oJMenuHistorique3 ==null){
					    oJMenuHistorique3 = new JMenuItem(listePoi.get(2).getNom());
					    oJMenuHistorique.add(oJMenuHistorique3);
					    oJMenuHistorique3.addActionListener(this);
					}
					else{
						oJMenuHistorique3.setText(listePoi.get(2).getNom());
					}					

				case 2 :
					if(oJMenuHistorique2 ==null){
					    oJMenuHistorique2 = new JMenuItem(listePoi.get(3).getNom());
					    oJMenuHistorique.add(oJMenuHistorique2);
					    oJMenuHistorique2.addActionListener(this);
					}
					else{
						oJMenuHistorique2.setText(listePoi.get(3).getNom());
					}

				case 1 :
					if(oJMenuHistorique1 ==null){
		   			    oJMenuHistorique1 = new JMenuItem(listePoi.get(4).getNom());
					    oJMenuHistorique.add(oJMenuHistorique1);
					    oJMenuHistorique1.addActionListener(this);
					}
					else{
						oJMenuHistorique1.setText(listePoi.get(4).getNom());
					}

				    break;
				}
			    
			}
			else if(oMSG.getData("typeDonnees") == "object"){
				Poi poi = (Poi) oMSG.getData("donnesS");
				oJMenuHistorique1 = new JMenuItem(poi.getNom());
			    oJMenuHistorique.add(oJMenuHistorique1);
			}
			else if(oMSG.getData("typeDonnees") == "null"){
				oJMenuHistorique1 = new JMenuItem("Pas d'historique trouvé");
			    oJMenuHistorique.add(oJMenuHistorique1);
			    oJMenuHistorique1.setEnabled(false);
			}
		}catch(Exception e){
			
		}
	    
	}

	/**
	 * @author : adel
	 * @description : Ajoute un poi à l'historique en session.
	 * @param : msg
	 * @fonctionnement : msg doit contenir un "POID" qui correspond à l'ID du POI cliqué, on fait alors un insert dans la table historique.
	 *	
	 */
	public void addPoiHistorique(MSG msg){

			if(msg.getData("POID") != null){
				histPOI = new Historique();
				MSG oMSG = new MSG();
				SimpleDateFormat formater = new SimpleDateFormat("yy-MM-dd HH:mm:ss"); 
				Date date = new Date(); 
				oMSG.setData("DATE_VISITE", formater.format(date));
				oMSG.setData("ID_POI", msg.getData("POID"));
				oMSG = histPOI.insert(oMSG);
				if(compteurHistoriqueSession<listeHistoriqueSession.size()){
					for (int i = compteurHistoriqueSession; i < listeHistoriqueSession.size(); i++) {
						listeHistoriqueSession.remove(i-1);
						btnPrecedent.setVisible(true);
					}
					listeHistoriqueSession.add(compteurHistoriqueSession,msg.getData("POID").toString());

				}
				else{
					listeHistoriqueSession.add(msg.getData("POID").toString());
					compteurHistoriqueSession = listeHistoriqueSession.size();
				}
				if(listeHistoriqueSession.size()==2){
					btnPrecedent.setEnabled(true);	
				}
				loadHistoriqueElement();
			}
		
		
	}
	/**	
	 * @author : adel
	 * @description : Affiche un élément sélectionné dans la liste_resultat. (Poi/Historique/Parcours/Lieu)
	 * @param : msg
	 * @fonctionnement : msg doit contenir msg.getdata("chaine") qui est le paramètre transmis à la requête
	 *
	 */
	public void loadPoi(MSG msg){
		Poi poiSelected = new Poi();
		MSG oMSG = new MSG();
		
		// *********** Rajout Ambroise **************
		// On split la chaine reçue dans le cas où elle aurait pas été split avant afin d'éliminer la partie suivant le nom
		//(Date pour l'historique, description pour les poi/parcours/Lieux recherchés)
		
		// *********** Fin rajout Ambroise **************
		
		//On défini les attribut message necessaire à la selection par nom ou par id
		if(msg.getData("methodchange")!=null){
			String idPoi = (String) msg.getData("id");
			String[] arrPoi = idPoi.split("-");
			idPoi = arrPoi[0].trim();
			
			oMSG.setData("method", "findById");
			oMSG.setData("id", idPoi);
		}
		else{
			String nomPoi = (String) msg.getData("chaine");
			String[] arrPoi = nomPoi.split("-");
			nomPoi = arrPoi[0].trim();
			
			oMSG.setData("method", "findByName");
			oMSG.setData("chaine", nomPoi);
		}
		//exécution de la requête findByName ou findById
		oMSG = poiSelected.find(oMSG);
		if(oMSG.getData("typeDonnees") == "list")
		{
			JOptionPane.showMessageDialog(null, "Plusieurs points d'intérêt ont été trouvés ce qui empèche le chargement du POI !", "Champ vide", JOptionPane.INFORMATION_MESSAGE);
		}
		else if(oMSG.getData("typeDonnees") == "object"){
			poiSelected = (Poi) oMSG.getData("donnees");
			oMSG.setData("typePoi","poiselect");
			oMSG.setData("typeDonnees", "poi");
			oMSG.setData("POI", poiSelected);
			//On récupère la carte associé au POI
			oMSG.setData("id", ((Poi) oMSG.getData("POI")).getIdCarte());
			loadMap(oMSG);
			afficherPois(oMSG);		
		}
		else if(oMSG.getData("typeDonnees") == "null"){
			JOptionPane.showMessageDialog(null, "Aucun POI n'a été trouvé !", "Champ vide", JOptionPane.INFORMATION_MESSAGE);
		}
		
	}
	/**	
	 * @author : adel
	 * @description : Affiche la carte en fonction de l'id passé en paramètre.
	 * @param : msg
	 * @fonctionnement : msg doit contenir msg.getdata("POI") qui contient l'IDCarte du POI
	 *
	 */
	public void loadMap (MSG msg){
		if(msg.getData("id") != null){
			MSG oMSGlieu = new MSG();
			oMSGlieu.setData("method", "findById");
			oMSGlieu.setData("id", msg.getData("id"));
			oMSGlieu = carteChoisie.find(oMSGlieu);
			if(oMSGlieu.getData("typeDonnees") == "list")
			{
				JOptionPane.showMessageDialog(null, "Plusieurs cartes ont été trouvés ce qui empèche le chargement de la carte !", "Champ vide", JOptionPane.INFORMATION_MESSAGE);
			}
			else if(oMSGlieu.getData("typeDonnees") == "object"){
				carteChoisie = (Carte) oMSGlieu.getData("donnees");
				cbbLieu.setSelectedItem(carteChoisie);
				afficherLieu();		
			}
			else if(oMSGlieu.getData("typeDonnees") == "null"){
				JOptionPane.showMessageDialog(null, "Aucune carte n'a été trouvée !", "Champ vide", JOptionPane.INFORMATION_MESSAGE);
			}
		}else{
			JOptionPane.showMessageDialog(null, "Erreur lors de l'exécution de la méthode "+this.getClass().getSimpleName()+".loadMap(). L'argument 'id' est obligatoire.", "Arguments manquants", JOptionPane.ERROR_MESSAGE);
		}
	}
}

